#include "head.h"

//通过用户名查user表
//第二个参数为获得的查询结果（一行数据）
//
int select_user(MYSQL *mysql, char *name, user_t *user){
    char sql[256] = {0};
    sprintf(sql, "select * from user where user_name = '%s'", name);
    mysql_query(mysql, sql);
    // 获得查询的结果
    MYSQL_RES *res = mysql_store_result(mysql);
    if(res == NULL){
        return -1;
    }
    unsigned int num_row = mysql_num_rows(res);
    if(num_row == 0){//二次检错
        return -1;
    }
    //处理结果
    //由于通过用户名查找user表中的内容，我们认为用户名是区别用户身份的唯一标识，
    //所以此时只有一条数据
    MYSQL_ROW row = mysql_fetch_row(res);
    //把查询到的结果写入结构体
    user->user_id = atoi(row[0]);
    user->user_name = row[1];
    user->pwd_hash = row[2];
    user->salt = row[3];
    user->file_id = atoi(row[4]);

    // 释放结果
    mysql_free_result(res);

    return 0;
}

//通过hash值查询file表
//第三个参数为获得的查询结果
int select_file(MYSQL *mysql, char *hash, file_t *file){
    char sql[256] = {0};
    sprintf(sql, "select * from file where file_hash = '%s'", hash);
    //printf("根据hash值查找file表的sql语句为：%s\n", sql);
    mysql_query(mysql, sql);
    // 获得查询的结果
    MYSQL_RES *res = mysql_store_result(mysql);
    if(res == NULL){
        printf("根据hash值查找失败，结果集为NULL\n");
        return -1;
    }
    unsigned int num_row = mysql_num_rows(res);
    if(num_row == 0){//二次检错
        printf("根据hash值查找失败，查找到0行结果\n");
        return -1;

    } 
    //处理结果
    //可能会有多条数据，但我们只保留第一条
    MYSQL_ROW row = mysql_fetch_row(res);
    //把查询到的结果写入结构体
    file->file_id = atoi(row[0]);
    file->parent_id = atoi(row[1]);
    file->file_name = row[2];
    file->user_id = atoi(row[3]);
    file->file_hash = row[4];
    file->file_types = row[5];
    file->file_path = row[6];
    file->cancel_flag = atoi(row[7]);
    if(strcmp(row[8], "0")==0){
        //有一条记录没有损坏，就证明数据库里有该文件
        mysql_free_result(res);
        return 0;
    }

    while((row = mysql_fetch_row(res)) != NULL){
        if(strcmp(row[8], "0")==0){
            //有一条记录没有损坏，就证明数据库里有该文件
            mysql_free_result(res);
            return 0;
        }
    }
    //运行到这里证明查询到的数据都是损坏的或者没有查到数据
    return -1;
}

//通过file_id查询file表
//通过file_id只能查到一条数据
//第二个参数为查询条件（file_id）
//第三个参数为获得的查询结果
//若未查询到数据，返回-1
int fileid_select_file(MYSQL *mysql, int file_id, file_t *file){
    char sql[256] = {0};
    sprintf(sql, "select * from file where file_id = %d", file_id);
    mysql_query(mysql, sql);
    // 获得查询的结果
    MYSQL_RES *res = mysql_store_result(mysql);
    if(res == NULL){
        return -1;
    }
    unsigned int num_row = mysql_num_rows(res);
    if(num_row == 0){//二次检错
        return -1;
    }
    //处理结果
    //只要查到了结果，则结果一定只有一条数据
    MYSQL_ROW row = mysql_fetch_row(res);   
    //把查询到的结果写入结构体
    file->file_id = atoi(row[0]);
    file->parent_id = atoi(row[1]);
    file->file_name = row[2];
    file->user_id = atoi(row[3]);
    file->file_hash = row[4];
    file->file_types = row[5];
    file->file_path = row[6];
    file->cancel_flag = atoi(row[7]);

    // 释放结果
    mysql_free_result(res);

}

#define SHA1_LEN 40
//*********************计算文件的hash值********************
int hash_sha1(char *file_hash_now, char *file_hash){
    //拼接要执行的命令
    char command[128] = { 0 };
    sprintf(command, "sha1sum ./file/%s", file_hash);
    FILE *pipe = popen(command, "r");
    fread(file_hash_now, 1, SHA1_LEN, pipe);
    // 确保字符串以空字符结尾
    file_hash[SHA1_LEN] = '\0';
    //printf("文件的hash值为%s\n", file_hash_now);
    pclose(pipe);
    return 0;
} 
